﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
//指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int* p = &arr[0];
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
//	}
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	//输⼊
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//输⼊
//	int* p = arr;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p + i);
//		//scanf("%d", arr+i);//也可以这样写
//	}
//	//输出
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", p[i]);
//	}
//	return 0;
//}
////在第18⾏的地⽅，将 * (p + i)换成p[i]也是能够正常打印的，所以本质上p[i] 是等价于 * (p + i)。
//模拟实现strlen
//
//
//strcpy，即string copy（字符串复制）的缩写。

//s'也会被拷贝。trcpy函数是C / C++语言的一个标准函数[1]  ，strcpy把含有'\0'结束符的字符串复制到另一个地址空间，返回值的类型为char * ，例如strcpy(arr1, arr2); 即为把数组arr2的内的字符串，复制到arr1中，注意：在字符串拷贝的过程中，'\0
//————————————————
//
//#include<stdio.h>
//
//void my_strcpy(char* dest, char* src)
//{
//	while (*src != '\0')
//	{
//		*dest = *src;
//		dest++;
//		src++;
//	}
//	*dest = *src;
//}
//
//int main()
//{
//	char arr1[20] = "xxxxxxxxxxx";
//	char arr2[] = "hello";
//
//	/*strcpy(arr1, arr2);*/
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}
//在某些时候，我们可能将my_strcpy处的指针传错，传成空指针，这种情况如何避免呢？我们可以使用一个库函数assert, 当assert(), 括号中可以放一个表达式，当表达式为假时就会报错。在上面的代码我们可以对一些部分进行完善，完善后的结果是：
//
//#include<stdio.h>
//#include<assert.h>
//
//void my_strcpy(char* dest, char* src)
//{
//	assert(dest && src);
//	while (*dest++ = *src++)
//	{
//		;
//	}
//}
//
//int main()
//{
//	char arr1[20] = "xxxxxxxxxxx";
//	char arr2[] = "hello";
//
//	/*strcpy(arr1, arr2);*/
//	my_strcpy(arr1, arr2);
//	printf("%s\n", arr1);
//	return 0;
//}
//完善版
//我们发现在strcpy的官方解释中：
//
//
//我们发现strcpy函数的参数类型和返回类型与我们设计的my_strcpy都不相同，那么为什么在strcpy函数设计初始会这样设计呢？
//
//如果在上述代码 * dest++ = *src++中，如果我们把dest和src写反了，程序会报错，那么如何避免这种问题，我们可以在 * src前面加上const，这样就增加了代码的健壮性，其次在strcpy函数中返回的类型是char * 类型，即函数返回的是目标空间的起始地址。下面我们按照strcpy函数尝试设计my_strcpy函数：
//
//
//3.2.1 代码实现
//#include<stdio.h>
//#include<assert.h>
//
//char* my_strcpy(char* dest, const char* src)
//{
//	char* ret = dest;
//	assert(dest && src);
//	while (*dest++ = *src++)
//	{
//		;
//	}
//	return ret;
//}
//
//int main()
//{
//	char arr1[20] = "xxxxxxxxxxx";
//	char arr2[] = "beautiful";
//	printf("%s\n", my_strcpy(arr1, arr2));
//	return 0;
//}
//模拟实现strcmp
